package org.fileupload.servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;

//@WebServlet(name = "FileUpLoad")
@WebServlet("/FileUpLoad")
public class FileUpLoad extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("hello world");
//        设置传输过程中的编码
        request.setCharacterEncoding("UTF-8");  // 设置接受时编码
        response.setCharacterEncoding("UTF-8");     // 设置响应时编码
        response.setContentType("text/html;charset=UTF-8");  // 设置页面显示编码，jsp页面头部的编码一样的
        try {
            boolean isMultipartContent = ServletFileUpload.isMultipartContent(request); //判断是否存在multipart字段
            if (isMultipartContent) {   // 如果存在说明有文件上传
//                ctrl+alt点击接口可以查看有那些实现类
                DiskFileItemFactory factory = new DiskFileItemFactory();    // 多态的写法
                ServletFileUpload upload = new ServletFileUpload(factory); // 创建文件上传对象，负责处理上传的对象

//                限制条件加载解析字段之前，如果解析之后在限制就晚了，文件已经接受到，并开始上传了。
                factory.setSizeThreshold(10240);    // 设置临时文件大小
                // 设置临时文件目录
                factory.setRepository(new File(request.getSession().getServletContext().getRealPath("uploadtemp")));
                upload.setSizeMax(20480);    // 单位字节，限制上传文件的大小，20k

//                通过parasRequest方法解析前端表单所有请求的字段，并保存到list集合中
                List<FileItem> itemList = upload.parseRequest(request);
                System.out.println(itemList.size());
                for (FileItem fileItem : itemList) {    // 通过循环，逐个取出表单中的字段
                    int age = -1;
                    String name = null;
                    String itemName = fileItem.getFieldName();   // 获取普通表单字段的名字
                    if (fileItem.isFormField()) {   // 如果是普通表单字段
                        if (itemName.equals("name")) {  // 如果是名字字段
                            name = fileItem.getString("UTF-8");    // 获取字段的值
                            System.out.println(name);
                        }else if (itemName.equals("age")){ // 否则，如果是年龄字段
                            age = Integer.valueOf(fileItem.getString("UTF-8"));    // 获取年龄字段的值，q强制转换成整形
                            System.out.println(age);
                        }else {
                            System.out.println("是其他字段");
                        }
                    }else { //否则，就是文件字段
                        String fileName = fileItem.getName(); // 获取文件名
//                        获取项目路径
                        String path = request.getSession().getServletContext().getRealPath("upload");




                        fileItem.write(new File(path,fileName));    // 写入文件，通过文件路径和文件名创建文件对象
                        System.out.println(fileName+"上传成功");
                        return;
                    }
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
